home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
cat
/
find2.d
< prev
next >
Wrap
Text File
|
1997-10-26
|
4KB
|
83 lines
DEFINITION MODULE Find2;
(* (c) Copyright 1992, Andreas Alich *)
FROM SYSTEM IMPORT ADDRESS;
TYPE
tpPattern = POINTER TO tPattern;
tpPat = POINTER TO tPat;
tPattern = RECORD
pFirst, (* erstes Teilmuster, ggf. NIL *)
pLast: tpPat; (* letztes Teilmuster, ggf. NIL *)
(* interne Werte: *)
any: CHAR;
backward: BOOLEAN;
END;
tpChar = POINTER TO CHAR;
tPat = RECORD
pNext, (* nchstes Teilmuster, ggf. NIL *)
pPrev: tpPat; (* vorheriges Teilmuster, ggf. NIL *)
pMatch: tpChar; (* Zeiger auf gefundene Textstelle *)
len: SHORTINT; (* Lnge des Teilmusters *)
(* interne Werte: *)
pLimit: tpChar;
no_eol: BOOLEAN;
eol: CHAR;
idx: SHORTINT;
d: ARRAY CHAR OF [0..255];
pattern: ARRAY SHORTCARD OF CHAR; (* formaler Typ *)
END;
PROCEDURE Compile (VAR pattern: ARRAY OF CHAR; (* Muster *)
exist, (* Joker fr genau ein beliebiges Zeichen *)
all: CHAR; (* Joker fr beliebig viele beliebige Zeichen,
auch keines und Zeilenende *)
all_but_eol: CHAR; (* Joker fr beliebig viele Zeichen
ungleich Zeilenende ('eol'),
auch keines *)
eol: CHAR; (* Zeichen, das bei 'all_but_eol' als Zeilenende
gewertet wird *)
cap, (* gro/klein ignorieren; nationale Sonderzeichen
werden bercksichtigt *)
backward: BOOLEAN (* rckwrts suchen *)
): tpPattern;
(*
Compiliert das Muster vor fr die eigentliche Suche mit Find. Die Werte
in den Records drfen nicht verndert werden!
Die Records werden mittels Storage alloziert. Falls der Speicher nicht
ausreicht, wird Exception.RAISE (Exception.eNoMemory) aufgerufen. Falls
kein Handler fr Exception installiert ist, wird im Fehlerfall NIL
zurckgegeben.
Die einzelnen tPat-Records reprsentieren ein Teilmuster, das durch einen
Allquantor vom nchsten Teilmuster im Muster getrennt ist. Mehrere
aufeinanderfolgende Allquantoren werden zu einem zusammengefaát.
Allquantoren am Anfang und am Ende des Musters werden ignoriert.
Existenzquantoren sind im Teilmuster enthalten.
*)
PROCEDURE Find (Text: ADDRESS; (* Anfangsadresse des zu durchsuchenden Textes *)
TextLen: LONGINT; (* Gesamtlnge des Textes *)
p: tpPattern; (* Zeiger auf vorcompiliertes Suchmuster *)
Start: LONGINT (* Such-Startposition im Text *)
): BOOLEAN;
(*
Durchsucht den Text ab Start nach dem bei Compile festgelegten Muster.
Falls das Muster gefunden wurde, wird TRUE geliefert, sonst FALSE.
Falls das Muster gefunden wurde, sind die Eintrge 'len' und 'pMatch'
in den tPat-Records gltig. 'pMatch' zeigt auf den Anfang des zum
Teilmuster passenden Textteils. 'len' gibt die Lnge des Teilmusters an.
Bei einem leeren Muster wird immer TRUE geliefert; in diesem Fall ist
'pPattern^.pFirst' = 'pPattern^.pLast' und in 'pPattern^.pFirst^.pMatch'
wird ein Zeiger auf die Startposition der Suche geliefert.
'pPattern^.pFirst^.len' ist in diesem Fall gleich Null.
*)
PROCEDURE Dispose (VAR pPattern: tpPattern);
(*
Gibt den Speicher, der bei 'Compile' alloziert wurde, wieder frei. Falls
'pPattern' NIL ist, so passiert nichts.
*)
END Find2.